# 70. Django框架、基础

# Django框架

# MVC框架 - web服务大部分使用的框架

MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

QBkmtO.png

**了解更多,可以考虑这文章:**http://www.ruanyifeng.com/blog/2007/11/mvc.html

# Django的MTV架构模式

Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

  1. Model(模型):负责业务对象与数据库的对象(ORM)
  2. Template(模版):负责如何把页面展示给用户
  3. View(视图):负责业务逻辑,并在适当的时候调用Model和Template

此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

QBEVJO.png

# 安装Django

命令行安装

pip install Django==1.11.11  ##安装
pip uninstall django  ##卸载

pycharm安装更简单,自行百度

# 创建第一个Django项目

命令行创建

django-admin startproject 项目名

PyCharm创建

File -> new Project -> 左侧选第二项,右侧第一项是路径,第二项是选python版本

在新的PyCharm窗口打开新建的Django项目

# 目录介绍

项目名/
├── manage.py  # 管理文件
├── templates  # html文件存放目录
└── 项目名  # 项目目录
    ├── __init__.py
    ├── settings.py  # 配置
    ├── urls.py  # 路由 --> URL和函数的对应关系
    └── wsgi.py  # runserver命令就使用wsgiref模块做简单的web server

# 模板文件配置

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夹位置
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# 静态文件配置

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),  # 静态文件存放位置
]

Qk7zkt.png

# 禁止表单提交检测

在settings.py的文件中,关闭46行的配置

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# Django基础必备三件套

from django.shortcuts import HttpResponse, render, redirect

# HttpResponse

内部传入一个字符串参数,返回给浏览器。

from django.shortcuts import HttpResponse
def index(request):
    # 业务逻辑代码
    return HttpResponse("OK")

# render

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)

from django.shortcuts import render
def index(request):
    # 业务逻辑代码
    return render(request, "index.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})

# redirect

接受一个URL参数,表示跳转到指定的URL。

def index(request):
    # 业务逻辑代码
    return redirect("/home/")

# Django的替换符(模板语言)

比如,在前端的html中,增加,在调用的时候进行赋值

# 前端部分内容
<p id="p1">{{ warning }}</p>


# django内容
def Login(request):
    warning = "错误"
    return render(request,"login.html",{"warning":warning})

# form表单提交数据的三个要素

  1. form标签必须要有action和method属性
  2. 所有获取用户输入的标签必须放在form表单中,必须要有name属性
  3. 必须要有submit按钮

# request相关的属性

  1. request.method --> 返回的是请求的方法(全大写):GET/POST ...
  2. request.GET --> 取得是URL里面的参数,类似于字典的数据结构
  3. request.POST --> post提交的数据,类似于字典的数据结构
    1. request.POST.get("提交表单时的name名"), --> 获取提交表单时发送过来的name名数据

# Django练习项目

# 登录项目 - 不带数据库版本

拿到前面前端写好的,登录界面跟博客界面

## urls.py
from django.conf.urls import url
from django.contrib import admin
import os,sys
server_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(server_path)
from cort import index,login


urlpatterns = [
    url(r'^index/$', index.Index),
    url(r'^$', login.Login),
    url(r'^login/$', login.Login)
]


## login.py
from django.shortcuts import render,redirect

def Login(request):
    warning = ''
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "admin" and pwd == "123":
            return redirect("/index/")
        else:
            warning = "用户名或密码错误"
    return render(request,"login.html",{"warning":warning})


## index.py
from django.shortcuts import render,redirect,HttpResponse
def Index(request):
    return render(request, 'index.html')

# Django创建项目包(app)

Django项目app --> 项目中又分了一级Python包,不同的功能放到不同的包里面

创建app

python3 manage.py startapp 项目包名

告诉Django创建了一个app

在settings.py找那个的INSTALLED_APPS中添加新创建的app

#比如创建了app01的项目包
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # 告诉Django我自己新建了一个名叫app01的应用
    # 'app01'
]

## 有二种告诉django的方向

## 第一种,推荐使用
'app01.apps.App01Config'
# app01 项目名
# apps 在创建项目中,有个apps的文件,里面大概是这些内容
	from django.apps import AppConfig
    class App01Config(AppConfig):
        name = 'app01'
# App01Config 就是apps文件中类的名字


## 第二种方法
'app01'
##直接写项目名

# ORM管理数据库 - 基础五步曲

用处 1. 操作数据表 2. 操作数据行

优点:

		1. 开发效率高
        			2. 开发不用直接写SQL语句

缺点:

1. 执行效率低

# 1. 修改django的默认数据库模块

django中默认的数据库模块是mysqldb,但是这模块比较少人使用,在加上,mysqldb不支持Python3,所以我们要修改django中的默认数据库模块

在项目中,找到主项目名的目录中的__init__文件

import pymysql
pymysql.install_as_MySQLdb()

## 告诉django,要使用pymysql来作为数据库模块

# 2. 配置数据库配置区

找到settings.py文件,在里面有个数据库配置区,默认是使用自带的db.sqlite3数据库文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 连接数据库的类型
        'NAME': 'project',  # 数据库名
        'HOST': '192.168.0.73',  # 数据库主机地址
        'PORT': 3306,  # 数据库的端口
        'USER': 'root', # 用户名
        'PASSWORD': '123456' # 密码,如果为空,也要写上 空字符串
    }
}

# 3. 创建表

在django中使用orm,需要在子项目中的models.py的文件中创建类

在ORM中

  1. 类 == 数据表
  2. 属性 == 字段
  3. 对象 == 数据行

在django中,用于orm的类,必须继承models.Model

from django.db import models

# Create your models here.

class User(models.Model):
    id = models.AutoField(primary_key=True)  # -> 创建一个自增的ID列作为主键
    user = models.CharField(max_length=24)  # -> varchar(32)
    pwd = models.CharField(max_length=16)  # -> varchar(32)

# 4. 生成记录跟提交修改

写在models.py文件中,如果有关数据库操作的,比如,添加表、增加行、删除行、修改行等,都需要执行以下的步骤,让需要变更的操作,先记录在子项目的migrations目录中,在进行提交更改

C:\Users\admin\AppData\Local\Programs\Python\Python36\python.exe

生成记录命令:python3 manage.py makemigrations

提交变更记录修改命令:python3 manage.py migrate

错误

## No changes detected
## 如果遇到以上的错误,本人的解决方案:检查你的子项目有没有添加在主项目包的配置文件中

# 5. 简单使用

from app_admin.models import User
ret = User.objects.filter(user=user, pwd=pwd)  ## 查询
print(ret)

执行结果:
<QuerySet []> ## 查询没有
<QuerySet [<User: User object>]>  ## 查询有值

## 查询返回的是一个列表,要是查询有值,那么就会返回一个带对象的列表,要是查询没有,那么就会返回空列表

# Django练习项目

# 登录项目 - 使用ORM对数据库进行交互

基于上面的实验

## models.py
from django.db import models

class User(models.Model):
    id = models.AutoField(primary_key=True)  # -> 创建一个自增的ID列作为主键
    user = models.CharField(max_length=24)  # -> varchar(32)
    pwd = models.CharField(max_length=16)  # -> varchar(32)
    
    
## login.py
from django.shortcuts import render,redirect
from app_admin.models import User

def Login(request):
    warning = ''
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        ret = User.objects.filter(user=user, pwd=pwd)
        print(ret)
        if ret:
            return redirect("/index/")
        else:
            warning = "用户名或密码错误"
    return render(request,"login.html",{"warning":warning})